/**
 * https://www.bilibili.com/video/BV1Mb411e7re?p=33
 * 视频最后3分钟, 使用PWM + 低通滤波, 产生DA转换
 * 
 * PWM介绍:
 *  PWM（Pulse Width Modulation）即脉冲宽度调制，在具有惯性的系统中，可以通过对一系列脉冲的宽度进行调制，来等效地获得所需要的模拟参量，常应用于电机控速、开关电源等领域
 *  PWM重要参数：
 *      频率 = 1 / TS       占空比 = TON / TS       精度 = 占空比变化步距
 */
#include <REGX52.H>
#include "Link/Delay_Utils.h"
#include "Link/Timer0_Utils.h"

static void Timer0_onTick();

//灯/电机端口
sbit DAC_Port = P2^1;

//对比值, 改变PWM占空比 (值越大, 灯越亮/电机越快)
static unsigned char Compare;

void main_DAC() {
    unsigned char i;
    //1.呼吸灯
    Timer0_Init(100, 0);
    Timer0_setOnTickListener_Exact(1, &Timer0_onTick);

    while (1) {
        //设置比较值，改变PWM占空比
        for(i = 0; i < 100; i++) { Compare = i; Delayms(10); }
        for(i = 100; i > 0; i--) { Compare = i; Delayms(10); }
    }
}

static void Timer0_onTick() {
    static unsigned char Counter;
    Counter++;
    //10ms进入1次
    if (Counter >= 100) {
        Counter = 0;
    }
    DAC_Port = Counter < Compare;
}
